home *** CD-ROM | disk | FTP | other *** search
Wrap
package java.security; import java.nio.ByteBuffer; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.security.spec.AlgorithmParameterSpec; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.crypto.Cipher; import sun.security.jca.GetInstance; import sun.security.jca.ServiceId; import sun.security.util.Debug; public abstract class Signature extends SignatureSpi { private static final Debug debug = Debug.getInstance("jca", "Signature"); private String algorithm; Provider provider; protected static final int UNINITIALIZED = 0; protected static final int SIGN = 2; protected static final int VERIFY = 3; protected int state = 0; private static final String RSA_SIGNATURE = "NONEwithRSA"; private static final String RSA_CIPHER = "RSA/ECB/PKCS1Padding"; private static final List<ServiceId> rsaIds = Arrays.asList(new ServiceId("Signature", "NONEwithRSA"), new ServiceId("Cipher", "RSA/ECB/PKCS1Padding"), new ServiceId("Cipher", "RSA/ECB"), new ServiceId("Cipher", "RSA//PKCS1Padding"), new ServiceId("Cipher", "RSA")); private static final Map<String, Boolean> signatureInfo = new ConcurrentHashMap(); protected Signature(String var1) { this.algorithm = var1; } public static Signature getInstance(String var0) throws NoSuchAlgorithmException { List var1; if (var0.equalsIgnoreCase("NONEwithRSA")) { var1 = GetInstance.getServices(rsaIds); } else { var1 = GetInstance.getServices("Signature", var0); } Iterator var2 = var1.iterator(); if (!var2.hasNext()) { throw new NoSuchAlgorithmException(var0 + " Signature not available"); } else { while(true) { Provider.Service var4 = (Provider.Service)var2.next(); if (isSpi(var4)) { return new Delegate(var4, var2, var0); } try { GetInstance.Instance var5 = GetInstance.getInstance(var4, SignatureSpi.class); return getInstance(var5, var0); } catch (NoSuchAlgorithmException var6) { if (!var2.hasNext()) { throw var6; } } } } } private static Signature getInstance(GetInstance.Instance var0, String var1) { Object var2; if (var0.impl instanceof Signature) { var2 = (Signature)var0.impl; } else { SignatureSpi var3 = (SignatureSpi)var0.impl; var2 = new Delegate(var3, var1); } ((Signature)var2).provider = var0.provider; return (Signature)var2; } private static boolean isSpi(Provider.Service var0) { if (var0.getType().equals("Cipher")) { return true; } else { String var1 = var0.getClassName(); Boolean var2 = (Boolean)signatureInfo.get(var1); if (var2 == null) { try { Object var3 = var0.newInstance((Object)null); boolean var4 = var3 instanceof SignatureSpi && !(var3 instanceof Signature); if (debug != null && !var4) { debug.println("Not a SignatureSpi " + var1); debug.println("Delayed provider selection may not be available for algorithm " + var0.getAlgorithm()); } var2 = var4; signatureInfo.put(var1, var2); } catch (Exception var5) { return false; } } return var2; } } public static Signature getInstance(String var0, String var1) throws NoSuchAlgorithmException, NoSuchProviderException { if (var0.equalsIgnoreCase("NONEwithRSA")) { if (var1 != null && var1.length() != 0) { Provider var3 = Security.getProvider(var1); if (var3 == null) { throw new NoSuchProviderException("no such provider: " + var1); } else { return getInstanceRSA(var3); } } else { throw new IllegalArgumentException("missing provider"); } } else { GetInstance.Instance var2 = GetInstance.getInstance("Signature", SignatureSpi.class, var0, var1); return getInstance(var2, var0); } } public static Signature getInstance(String var0, Provider var1) throws NoSuchAlgorithmException { if (var0.equalsIgnoreCase("NONEwithRSA")) { if (var1 == null) { throw new IllegalArgumentException("missing provider"); } else { return getInstanceRSA(var1); } } else { GetInstance.Instance var2 = GetInstance.getInstance("Signature", SignatureSpi.class, var0, var1); return getInstance(var2, var0); } } private static Signature getInstanceRSA(Provider var0) throws NoSuchAlgorithmException { Provider.Service var1 = var0.getService("Signature", "NONEwithRSA"); if (var1 != null) { GetInstance.Instance var4 = GetInstance.getInstance(var1, SignatureSpi.class); return getInstance(var4, "NONEwithRSA"); } else { try { Cipher var2 = Cipher.getInstance("RSA/ECB/PKCS1Padding", var0); return new Delegate(new CipherAdapter(var2), "NONEwithRSA"); } catch (GeneralSecurityException var3) { throw new NoSuchAlgorithmException("no such algorithm: NONEwithRSA for provider " + var0.getName(), var3); } } } public final Provider getProvider() { this.chooseFirstProvider(); return this.provider; } void chooseFirstProvider() { } public final void initVerify(PublicKey var1) throws InvalidKeyException { this.engineInitVerify(var1); this.state = 3; } public final void initVerify(Certificate var1) throws InvalidKeyException { if (var1 instanceof X509Certificate) { X509Certificate var2 = (X509Certificate)var1; Set var3 = var2.getCriticalExtensionOIDs(); if (var3 != null && !var3.isEmpty() && var3.contains("2.5.29.15")) { boolean[] var4 = var2.getKeyUsage(); if (var4 != null && !var4[0]) { throw new InvalidKeyException("Wrong key usage"); } } } PublicKey var5 = var1.getPublicKey(); this.engineInitVerify(var5); this.state = 3; } public final void initSign(PrivateKey var1) throws InvalidKeyException { this.engineInitSign(var1); this.state = 2; } public final void initSign(PrivateKey var1, SecureRandom var2) throws InvalidKeyException { this.engineInitSign(var1, var2); this.state = 2; } public final byte[] sign() throws SignatureException { if (this.state == 2) { return this.engineSign(); } else { throw new SignatureException("object not initialized for signing"); } } public final int sign(byte[] var1, int var2, int var3) throws SignatureException { if (var1 == null) { throw new IllegalArgumentException("No output buffer given"); } else if (var1.length - var2 < var3) { throw new IllegalArgumentException("Output buffer too small for specified offset and length"); } else if (this.state != 2) { throw new SignatureException("object not initialized for signing"); } else { return this.engineSign(var1, var2, var3); } } public final boolean verify(byte[] var1) throws SignatureException { if (this.state == 3) { return this.engineVerify(var1); } else { throw new SignatureException("object not initialized for verification"); } } public final boolean verify(byte[] var1, int var2, int var3) throws SignatureException { if (this.state == 3) { if (var1 != null && var2 >= 0 && var3 >= 0 && var2 + var3 <= var1.length) { return this.engineVerify(var1, var2, var3); } else { throw new IllegalArgumentException("Bad arguments"); } } else { throw new SignatureException("object not initialized for verification"); } } public final void update(byte var1) throws SignatureException { if (this.state != 3 && this.state != 2) { throw new SignatureException("object not initialized for signature or verification"); } else { this.engineUpdate(var1); } } public final void update(byte[] var1) throws SignatureException { this.update(var1, 0, var1.length); } public final void update(byte[] var1, int var2, int var3) throws SignatureException { if (this.state != 2 && this.state != 3) { throw new SignatureException("object not initialized for signature or verification"); } else { this.engineUpdate(var1, var2, var3); } } public final void update(ByteBuffer var1) throws SignatureException { if (this.state != 2 && this.state != 3) { throw new SignatureException("object not initialized for signature or verification"); } else if (var1 == null) { throw new NullPointerException(); } else { this.engineUpdate(var1); } } public final String getAlgorithm() { return this.algorithm; } public String toString() { String var1 = ""; switch (this.state) { case 0: var1 = "<not initialized>"; case 1: default: break; case 2: var1 = "<initialized for signing>"; break; case 3: var1 = "<initialized for verifying>"; } return "Signature object: " + this.getAlgorithm() + var1; } /** @deprecated */ @Deprecated public final void setParameter(String var1, Object var2) throws InvalidParameterException { this.engineSetParameter(var1, var2); } public final void setParameter(AlgorithmParameterSpec var1) throws InvalidAlgorithmParameterException { this.engineSetParameter(var1); } public final AlgorithmParameters getParameters() { return this.engineGetParameters(); } /** @deprecated */ @Deprecated public final Object getParameter(String var1) throws InvalidParameterException { return this.engineGetParameter(var1); } public Object clone() throws CloneNotSupportedException { if (this instanceof Cloneable) { return super.clone(); } else { throw new CloneNotSupportedException(); } } // $FF: synthetic method static String access$000(Signature var0) { return var0.algorithm; } // $FF: synthetic method static Debug access$100() { return debug; } // $FF: synthetic method static boolean access$200(Provider.Service var0) { return isSpi(var0); } static { Boolean var0 = Boolean.TRUE; signatureInfo.put("sun.security.provider.DSA$RawDSA", var0); signatureInfo.put("sun.security.provider.DSA$SHA1withDSA", var0); signatureInfo.put("sun.security.rsa.RSASignature$MD2withRSA", var0); signatureInfo.put("sun.security.rsa.RSASignature$MD5withRSA", var0); signatureInfo.put("sun.security.rsa.RSASignature$SHA1withRSA", var0); signatureInfo.put("sun.security.rsa.RSASignature$SHA256withRSA", var0); signatureInfo.put("sun.security.rsa.RSASignature$SHA384withRSA", var0); signatureInfo.put("sun.security.rsa.RSASignature$SHA512withRSA", var0); signatureInfo.put("com.sun.net.ssl.internal.ssl.RSASignature", var0); signatureInfo.put("sun.security.pkcs11.P11Signature", var0); } }